package org.ma1.cripto.aes.interfaz;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.ma1.cripto.aes.comun.Bloque;
import org.ma1.cripto.aes.comun.Texto;

public class TransformadorBasico implements ITransformador {

	/*
	 * este m�todo toma una cadena y crea un texto, que no es m�s q una lista de
	 * bloques. En caso de que fuera necesario, este m�todo rellena el �ltimo
	 * bloque para que se alcancen los 16 bits.
	 */
	public Texto transformar(String texto) {
		Texto t = new Texto();
		byte[] bytes = texto.getBytes();
		byte[] bytes2 = null;
		if (bytes.length % 16 != 0) {
			int padding = (16 - (bytes.length % 16));

			bytes2 = new byte[bytes.length + padding];
			System.arraycopy(bytes, 0, bytes2, 0, bytes.length);

			for (int i = 0; i < padding; i++) {

				//JORGE rellenaba con  127
				bytes2[bytes.length + i] = 0;
			}

		}
		List<Bloque> bloques = new LinkedList<Bloque>();
		// si no ha habido relleno
		if (bytes2 == null) {
			for (int i = 0; i < bytes.length; i += 16) {
				byte[] subBloque = new byte[16];
				System.arraycopy(bytes, i, subBloque, 0, 16);
				Bloque b = new Bloque();
				b.setByte(subBloque);
				bloques.add(b);
			}
		}
		// si ha habido
		else if (bytes2 != null) {
			for (int i = 0; i < bytes2.length; i += 16) {
				byte[] subBloque = new byte[16];
				System.arraycopy(bytes2, i, subBloque, 0, 16);
				Bloque b = new Bloque();
				b.setByte(subBloque);

				bloques.add(b);
			}
		}
		t.setBloques(bloques);

		return t;
	}

	public String transformarInverso(Texto texto) {
		if (texto == null)
			return "";
		// Se toman los bloques del texto
		List<Bloque> bloques = texto.getBloques();

		// Se comprueba que todos los bloques tienen el mismo tama�o
		Bloque b1 = null, b2;
		Iterator it = bloques.iterator();
		if (it.hasNext())
			b1 = (Bloque) it.next();
		while (it.hasNext()) {
			b2 = b1;
			b1 = (Bloque) it.next();
			if (b2.getTamBloque() != b1.getTamBloque())
				return "";
		}

		// Se concatenan en un array
		byte[] array = new byte[b1.getTamBloque() * bloques.size()];

		byte[] aux = new byte[b1.getTamBloque()];

		Iterator it2 = bloques.iterator();
		int cont = 0;
		int tam = b1.getTamBloque();
		while (it2.hasNext()) {
			aux = ((Bloque) it2.next()).getBloque();
			System.arraycopy(aux, 0, array, cont, tam); // copia lo que hay en
			// aux, desde la
			// posicion 0, en array
			// desde la posicion
			// cont el tama�o TAM

			cont += tam;
		}

		// Se pasa este array a cadena
		String res = new String(array);
		return res;
	}

}
